﻿/*----------------------------------------------------------------
//  <copyright file="IMapper.cs" company="MicroCloud@151504200868">
//      Copyright © 2020-2024 MicroCloud Corporation, All rights reserved.
//  </copyright>
//  <site>https://gitee.com/chenmm123/microclouds</site>
//  <last-editor>cmm</last-editor>
//  <last-date>2023-09-25 14:31</last-date>
//----------------------------------------------------------------*/

namespace MicroCloud.Mapping
{
    #region "对象映射器"
    /// <summary>
    /// 对象映射器
    /// </summary>
    public interface IMapper
    {
        #region "方法"
        #region "将对象映射为指定类型"
        /// <summary>
        /// 将对象映射为指定类型
        /// </summary>
        /// <typeparam name="TTarget">要映射的目标类型</typeparam>
        /// <param name="source">源对象</param>
        /// <returns>目标类型的对象</returns>
        TTarget MapTo<TTarget>(object source);
        #endregion
        #region "将对象映射为指定类型"
        /// <summary>
        /// 将对象映射为指定类型
        /// </summary>
        /// <typeparam name="TSource">源类型</typeparam>
        /// <typeparam name="TTarget">目标类型</typeparam>
        /// <param name="source">源对象</param>
        /// <returns>目标类型的对象</returns>
        TTarget MapTo<TSource, TTarget>(TSource source);
        #endregion
        #region "使用源类型的对象更新目标类型的对象"
        /// <summary>
        /// 使用源类型的对象更新目标类型的对象
        /// </summary>
        /// <typeparam name="TSource">源类型</typeparam>
        /// <typeparam name="TTarget">目标类型</typeparam>
        /// <param name="source">源对象</param>
        /// <param name="target">待更新的目标对象</param>
        /// <returns>更新后的目标类型对象</returns>
        TTarget MapTo<TSource, TTarget>(TSource source, TTarget target);
        #endregion
        #region "将数据源映射为指定输出DTO的集合"
        /// <summary>
        /// 将数据源映射为指定输出DTO的集合
        /// </summary>
        /// <typeparam name="TOutputDto">输出DTO类型</typeparam>
        /// <param name="source">数据源</param>
        /// <param name="membersToExpand">成员展开</param>
        /// <returns>输出DTO的结果集</returns>
        IQueryable<TOutputDto> ToOutput<TOutputDto>(IQueryable source, params Expression<Func<TOutputDto, object>>[] membersToExpand);
        #endregion

        #region "将对象映射为指定类型的集合"
        /// <summary>
        /// 将对象映射为指定类型的集合
        /// </summary>
        /// <typeparam name="TSource">源类型</typeparam>
        /// <typeparam name="TTarget">目标类型</typeparam>
        /// <param name="source">源对象集合</param>
        /// <returns>目标类型对象集合</returns>
        IEnumerable<TTarget> MapToList<TSource, TTarget>(IEnumerable<TSource> source);
        #endregion
        #region "使用源类型的对象集合更新目标类型的对象集合"
        /// <summary>
        /// 使用源类型的对象集合更新目标类型的对象集合
        /// </summary>
        /// <typeparam name="TSource">源类型</typeparam>
        /// <typeparam name="TTarget">目标类型</typeparam>
        /// <param name="source">源对象集合</param>
        /// <param name="target">待更新的目标对象集合</param>
        /// <returns>更新后的目标类型对象集合</returns>
        IEnumerable<TTarget> MapToList<TSource, TTarget>(IEnumerable<TSource> source, IEnumerable<TTarget> target);
        #endregion
        #region "将DataReader映射为指定类型集合"
        /// <summary>
        /// 将DataReader映射为指定类型集合
        /// </summary>
        /// <typeparam name="TTarget">目标类型</typeparam>
        /// <param name="reader">DataReader对象</param>
        /// <returns>更新后的目标类型对象集合</returns>
        IEnumerable<TTarget> DataReaderMapTo<TTarget>(IDataReader reader);
        #endregion

        #endregion

    }
    #endregion

}
